package boot.exception;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: zhiyu
 * @Date:15:28
 * @DESC:
 * 方式四:自定义实现 HandlerExceptionResolver 处理异常
 * * 1.使用场景：返回ModelAndView 更适合前后端不分离，自定义错误页面(放置在任意路径，任意文件名)
 *  *
 *  * 底层：
 *  * 1.只要执行response.sendError() ，由tomcat发起/error请求
 *  * 2.出现的异常没有任何人来处理，也会执行执行response.sendError(),tomcat发起/error请求
 *  * 3./error请求 找到 BasicErrorController由她来处理
 */
@Component
//优先级最高
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomExceptionResolver implements HandlerExceptionResolver {
    /**
     *
     * @param request 请求
     * @param response 响应
     * @param handler xxxController#xxx方法
     * @param ex 异常对象
     * @return 数据和视图
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        if(ex instanceof CustomException) {
            try {
                response.sendError(511, ex.getMessage());// 交给tomcat发起/error请求
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new ModelAndView();//由默认规则来处理
    }
}